﻿namespace Charades.Web.Helpers
{
	using System;
	using System.Collections;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text.RegularExpressions;

	using Charades.Web.DAL;

	public static class WordsHelper
	{
		private static readonly List<string> Words = new List<string>();
		private static readonly Random Random = new Random();
		private static readonly Hashtable SimilarChars = new Hashtable(){
																			{'ё','е'},
																			{'й','и'},
																			{'ъ','ь'}
																		};
		private static readonly Regex Regexp = new Regex(@"[^А-яA-z\s]");

		static WordsHelper()
		{
			Words = (new DBHandler()).GetAllWords();
			//File.WriteAllLines(AppDomain.CurrentDomain.BaseDirectory + @"App_Data\word_base2.txt", words);
		}

		/// <summary>
		/// Возвращает массив рандомных слов для раунда
		/// </summary>
		/// <returns>Массив слов для раунда</returns>
		public static string[] GetWords()
		{
			var res = new string[3];
			res[0] = Words[Random.Next(Words.Count - 1)].ToUpper();
			res[1] = Words[Random.Next(Words.Count - 1)].ToUpper();
			res[2] = Words[Random.Next(Words.Count - 1)].ToUpper();
			return res;
		}

		/// <summary>
		/// Поиск в сообщении слова
		/// </summary>
		/// <param name="message">Сообщение</param>
		/// <param name="source">Слово</param>
		/// <returns>true - если сообщение содержит слово</returns>
		public static bool Compare(string message, string source)
		{
			var messageWords = ClearString(message).Split(' ').Where(x => !string.IsNullOrEmpty(x)).ToArray();
			source = ClearString(source).Replace(" ", string.Empty);

			return messageWords.Contains(source);
		}

		/// <summary>
		/// Чистка строки от лишних символов, замена смежных символов
		/// </summary>
		/// <param name="str">Исходная строка</param>
		/// <returns>Очищенная строка</returns>
		private static string ClearString(string str)
		{
			return
				new string(
					Regexp.Replace(str.ToLower(), " ").Select(x => SimilarChars.ContainsKey(x) ? (char)SimilarChars[x] : x).ToArray());
		}
	}
}